package br.ucb.ucblive.managedbean;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletContext;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

import br.ucb.ucblive.HIB.MensagemHIB;
import br.ucb.ucblive.HIB.MensagemUsuarioHIB;
import br.ucb.ucblive.HIB.UsuarioHIB;
import br.ucb.ucblive.beans.Mensagem;
import br.ucb.ucblive.beans.MensagemUsuario;
import br.ucb.ucblive.beans.MensagemUsuarioPK;
import br.ucb.ucblive.beans.Usuario;
import br.ucb.ucblive.datamodel.MensagemDataModel;
import br.ucb.ucblive.recursos.MensagemConfirmacao;

@ManagedBean(name="mensagemManagedBean")
@SessionScoped
public class MensagemManagedBean{

	private Mensagem mensagem;
	private ArrayList<Mensagem> mensagens;
	private List<Mensagem> mensagensEscolhidas;
	private MensagemHIB mensagemHIB;
	private MensagemUsuarioHIB muHIB;
	private MensagemDataModel mensagensModel;
	private List<Usuario> usuarios;
	private Collection<Usuario> usuariosDest;
	private Usuario usuarioLogin;
	UsuarioHIB usuarioHIB;
	private boolean novaMensagem;
	private boolean minhaCaixaEntrada;
	private int quantidadeNovasMensagens;
	private MensagemConfirmacao mensagemConfirmacao;
	private UploadedFile arquivo;
	private StreamedContent arquivoDownload;
	
	public MensagemManagedBean(){
		setMensagem(new Mensagem());
		setMensagens(new ArrayList<Mensagem>());
		setMensagensEscolhidas(new ArrayList<Mensagem>());
		setMensagemHIB(new MensagemHIB());
		setMuHIB(new MensagemUsuarioHIB());
		setUsuarioHIB(new UsuarioHIB());
		setMensagemConfirmacao(new MensagemConfirmacao());
		setUsuarioLogin(usuarioHIB.consultar
					   (FacesContext.getCurrentInstance().
						getExternalContext().getUserPrincipal().getName()
						));
		
	}
	
	public MensagemConfirmacao getMensagemConfirmacao() {
		return mensagemConfirmacao;
	}

	public void setMensagemConfirmacao(MensagemConfirmacao mensagemConfirmacao) {
		this.mensagemConfirmacao = mensagemConfirmacao;
	}

	public Mensagem getMensagem() {
		return mensagem;
	}

	public void setMensagem(Mensagem mensagem) {
		this.mensagem = mensagem;
	}

	public ArrayList<Mensagem> getMensagens() {
		return mensagens;
	}

	public void setMensagens(ArrayList<Mensagem> mensagens) {
		this.mensagens = mensagens;
	}
	
	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(ArrayList<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public Collection<Usuario> getUsuariosDest() {
		return usuariosDest;
	}

	public void setUsuariosDest(Collection<Usuario> usuariosDest) {
		this.usuariosDest = usuariosDest;
	}

	public MensagemHIB getMensagemHIB() {
		return mensagemHIB;
	}

	public void setMensagemHIB(MensagemHIB mensagemHIB) {
		this.mensagemHIB = mensagemHIB;
	}

	public MensagemUsuarioHIB getMuHIB() {
		return muHIB;
	}

	public void setMuHIB(MensagemUsuarioHIB muHIB) {
		this.muHIB = muHIB;
	}

	public UsuarioHIB getUsuarioHIB() {
		return usuarioHIB;
	}

	public void setUsuarioHIB(UsuarioHIB usuarioHIB) {
		this.usuarioHIB = usuarioHIB;
	}

	public Usuario getUsuarioLogin() {
		return usuarioLogin;
	}

	public void setUsuarioLogin(Usuario usuarioLogin) {
		this.usuarioLogin = usuarioLogin;
	}

	public List<Mensagem> getMensagensEscolhidas() {
		return mensagensEscolhidas;
	}

	public void setMensagensEscolhidas(List<Mensagem> mensagensEscolhidas) {
		this.mensagensEscolhidas = mensagensEscolhidas;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	public MensagemDataModel getMensagensModel() {
		return mensagensModel;
	}

	public void setMensagensModel(MensagemDataModel mensagensModel) {
		this.mensagensModel = mensagensModel;
	}

	public boolean isNovaMensagem() {
		return novaMensagem;
	}

	public void setNovaMensagem(boolean novaMensagem) {
		this.novaMensagem = novaMensagem;
	}

	public boolean isMinhaCaixaEntrada() {
		return minhaCaixaEntrada;
	}

	public void setMinhaCaixaEntrada(boolean minhaCaixaEntrada) {
		this.minhaCaixaEntrada = minhaCaixaEntrada;
	}
	
	public int getQuantidadeNovasMensagens() {
		return quantidadeNovasMensagens;
	}

	public void setQuantidadeNovasMensagens(int quantidadeNovasMensagens) {
		this.quantidadeNovasMensagens = quantidadeNovasMensagens;
	}

	public UploadedFile getArquivo() {
		return arquivo;
	}

	public void setArquivo(UploadedFile arquivo) {
		this.arquivo = arquivo;
	}

	public StreamedContent getArquivoDownload() {
		return arquivoDownload;
	}

	public void setArquivoDownload(StreamedContent arquivoDownload) {
		this.arquivoDownload = arquivoDownload;
	}

	public String insere(){
		mensagem.setData(new Date());
		mensagemHIB.salvar(mensagem);
		MensagemUsuario mensagemUsuario = new MensagemUsuario();
		MensagemUsuarioPK id = new MensagemUsuarioPK();
		
		// Salva todos os destinat�rios com o status igual a 1 => N�o lida
		for (Usuario usuario : usuariosDest) {
			mensagemUsuario = new MensagemUsuario();
			id = new MensagemUsuarioPK();
			
			id.setUsuario(usuario);
			id.setMensagem(mensagem);
			
			mensagemUsuario.setId(id);
			mensagemUsuario.setStatus(1);
			mensagemUsuario.setLoginRemetente(usuarioLogin);
			
			muHIB.salvar(mensagemUsuario);
		}
		
		// Salva o Usu�rio que est� mandando a mensagem com o status igual a 0 => Lida
		id.setMensagem(mensagem);
		id.setUsuario(usuarioLogin);
		mensagemUsuario.setId(id);
		mensagemUsuario.setStatus(0);
		mensagemUsuario.setLoginRemetente(usuarioLogin);
		muHIB.salvar(mensagemUsuario);
		getMensagemConfirmacao().mensagemEnviada();
		
		setMensagem(new Mensagem());
		setUsuariosDest(new ArrayList<Usuario>());
		setNovaMensagem(false);
		return "index.jsf";
	}
	
	public List<Usuario> listarUsuarios(String query){
		List<Usuario> usuariosBuscados = new ArrayList<Usuario>();
		for (Usuario user : getUsuarios()) {
			if((user.getTipo()==1 && user.getModerador().getNome().toUpperCase().startsWith(query.toUpperCase())) ||
			   (user.getTipo()==2 && user.getProfessor().getNome().toUpperCase().startsWith(query.toUpperCase())) ||
			   (user.getTipo()==3 && user.getAluno().getNome().toUpperCase().startsWith(query.toUpperCase())))
				usuariosBuscados.add(user);
		}
		return usuariosBuscados;
	}
	
	public String populaUsuarios(){
		setMensagem(new Mensagem());
		usuarios = usuarioHIB.listarLessAdministrador();
		return "/pro/mensagemForm?faces-redirect=true";
	}
	
	public void mensagemSelecionada(ActionEvent e){
		mensagem = (Mensagem)e.getComponent().getAttributes().get("mensagem");
		MensagemUsuario mu = new MensagemUsuario();
		MensagemUsuarioPK id = new MensagemUsuarioPK();
		id.setMensagem(mensagem);
		id.setUsuario(getUsuarioLogin());
		mu = muHIB.consultar(id);
		if(mu.getStatus()==1){
			mu.setStatus(0);
			muHIB.salvar(mu);
		}
		setMensagensEscolhidas(new ArrayList<Mensagem>());
		setNovaMensagem(false);
	}
	
	public void excluir(){
		for (Mensagem m : mensagensEscolhidas) {
			MensagemUsuario mu = new MensagemUsuario();
			MensagemUsuarioPK id = new MensagemUsuarioPK();
			id.setMensagem(m);
			id.setUsuario(getUsuarioLogin());
			mu = muHIB.consultar(id);
			muHIB.excluir(mu);
		}
		
		setMensagem(new Mensagem());
		setMensagens(new ArrayList<Mensagem>());
		setMensagensEscolhidas(new ArrayList<Mensagem>());
		getMensagemConfirmacao().mensagemExcluida();
		if(minhaCaixaEntrada)
			mensagens.addAll(mensagemHIB.listarMensagensByUsuarioRemetente(usuarioLogin.getLogin()));
		else
			mensagens.addAll(mensagemHIB.listarMensagensByUsuario(usuarioLogin.getLogin()));
		setMensagensModel(new MensagemDataModel(mensagens));
	}
	
	public String populaMensagens(){
		setNovaMensagem(false);
		setMensagem(new Mensagem());
		setMensagens(new ArrayList<Mensagem>());
		setMensagensEscolhidas(new ArrayList<Mensagem>());			
			
		mensagens.addAll(mensagemHIB.listarMensagensByUsuario(usuarioLogin.getLogin()));
		setMensagensModel(new MensagemDataModel(mensagens));
		setMinhaCaixaEntrada(false);
		return "/alu/mensagemList?faces-redirect=true";
	}
	
	public void minhasMensagens(){
		setMensagens(new ArrayList<Mensagem>());
		mensagens.addAll(mensagemHIB.listarMensagensByUsuarioRemetente(usuarioLogin.getLogin()));
		setMensagensModel(new MensagemDataModel(mensagens));
		setMinhaCaixaEntrada(true);
	}
	
	public void notificationMensagens(){
		setMensagens(new ArrayList<Mensagem>());
		mensagens.addAll(mensagemHIB.listarMensagensByUsuario(usuarioLogin.getLogin()));
		setQuantidadeNovasMensagens(mensagemHIB.isNotLidaSize(usuarioLogin,mensagens));
	}

	public void anexar(){
		if(arquivo!=null){
			mensagem.setAnexo(arquivo.getContents());
			mensagem.setNomeArquivo(arquivo.getFileName());
		}
	}
	
	public void download() {    
        InputStream stream = new ByteArrayInputStream(mensagem.getAnexo());
        arquivoDownload = new DefaultStreamedContent(stream,null,mensagem.getNomeArquivo());
    }  
}
